/********************************************************************************
 *      Copyright:  (C) 2020 Juan
 *                  All rights reserved.
 *
 *       Filename:  G4module_server.h
 *    Description:  This head file 
 *
 *        Version:  1.0.0(22/07/20)
 *         Author:  wangruijie <1046299465@qq.com>
 *      ChangeLog:  1, Release initial version on "22/07/20 03:11:17"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include <sys/select.h>
#include <getopt.h>
#include <libgen.h>
#include <sys/socket.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <event.h>
#include <stdlib.h>
#include <errno.h>


#define  BACK_LOG   64
#define  BUF_SIZE   1024

//用户写事件完成后的销毁，在on_write()中执行
struct sock_ev_write
{
    struct event* write_ev;
    char* buffer;
};

//用于读事件终止（socket断开）后的销毁
struct sock_ev
{
    struct event_base* base;    //因为socket断掉后，读事件的loop要终止，所以要有base指针
    struct event* read_ev;
};

/*  销毁写事件完成后的结构体 */
void destroy_sock_ev_write(struct sock_ev_write* sock_ev_write_struct);
/*  读事件结束后，用于销毁相应的资源*/
void destroy_sock_ev(struct sock_ev* sock_ev_struct);
/* 每当有新连接连到server时，就通过libevent调用此函数，连接客户端 */
void on_accept(int sock, short event, void* arg);
/* 接收客户端收到的消息， */
void on_read(int sock, short event, void* arg);
/* 发送数据给客户端 */
void on_write(int sock, short event, void* arg);
/* main执行accept()得到新socket_fd的时候，执行这个函数，创建一个新线程，在新线程里反馈给client收到的信息 */
void* process_in_new_thread_when_accepted(void* arg);
/* 每当accept出一个新的socket_fd时，调用这个函数，创建一个新线程，在新线程里与client做交互 */
void accept_new_thread(int sock);
/* 打印帮助信息 */
void print_usage(char *progname);
/* 解包json数据 */
int unpack_json(char *buf, char *rbuf);
